package cn.lg.soar.system.api.utils;

import cn.lg.soar.common.util.data.DataUtil;
import cn.lg.soar.core.util.SoarSubscriber;
import cn.lg.soar.system.api.model.DictItemVo;
import cn.lg.soar.system.api.service.IDictApi;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

/**
 * 字典工具
 * @author luguoxiang
 * @date 2025-07-15
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public class DictUtils {

    private static IDictApi api;
    static {
        SoarSubscriber.subscribeInit(applicationContext -> {
            api = applicationContext.getBean(IDictApi.class);
        });
    }

    /**
     * 根据字典类型获取数据字典list
     * @param type 字典类型
     * @return
     */
    public static List<DictItemVo> listByType(String type) {
        return api.listByType(type);
    }


    /**
     * 批量获取
     * @param types 字典类型
     * @return
     */
    public static Map<String, List<DictItemVo>> listBatch(Collection<String> types) {
        return api.listBatch(types);
    }

    /**
     * 获取数据字典
     * @param type 字典类型
     * @param value 字典值
     * @return
     */
    public static DictItemVo getDict(String type, Integer value) {
        return api.getDict(type, value);
    }

    /**
     * 获取字典标签名
     * @param type 字典类型
     * @param value 字典值
     * @return
     */
    public static String getLabel(String type, Integer value) {
        return api.getLabel(type, value);
    }

    /**
     * 批量获取
     * @param types 字典类型
     * @return
     */
    public static Map<String, List<DictItemVo>> listBatch(String ...types) {
        return api.listBatch(types);
    }


    /**
     * 根据字典类型获取数据字典map
     * @param type 字典类型
     * @return
     */
    public static Map<Integer, DictItemVo> mapByType(String type) {
        return api.mapByType(type);
    }

    /**
     * 根据字典类型获取数据字典map
     * @param type 字典类型
     * @return
     */
    public static Map<Integer, String> labelMapByType(String type) {
        return api.labelMapByType(type);
    }


    /**
     * 根据字典类型获取数据字典map
     * @param types 字典类型
     * @return
     */
    public static Map<String, Map<Integer, DictItemVo>> mapBatch(Collection<String> types) {
        return api.mapBatch(types);
    }

    /**
     * 根据字典类型获取数据字典map
     * @param types 字典类型
     * @return
     */
    public static Map<String, Map<Integer, DictItemVo>> mapBatch(String ...types) {
        return api.mapBatch(types);
    }

    /**
     * 根据字典类型获取数据字典map
     * @param types 字典类型
     * @return
     */
    public static Map<String, Map<Integer, String>> labelMapBatch(Collection<String> types) {
        return api.labelMapBatch(types);
    }

    /**
     * 根据字典类型获取数据字典map
     * @param types 字典类型
     * @return
     */
    public static Map<String, Map<Integer, String>> labelMapBatch(String ...types) {
        return api.labelMapBatch(types);
    }

    /**
     * 获取数据字典
     * @param type 字典类型
     * @param values 字典值
     * @return
     */
    public static Stream<DictItemVo> getDicts(String type, Collection<Integer> values) {
        return api.getDicts(type, values);
    }

    /**
     * 获取数据字典
     * @param type 字典类型
     * @param values 字典值
     * @return
     */
    public static Stream<DictItemVo> getDicts(String type, Integer...values) {
        return api.getDicts(type, values);
    }

    /**
     * 获取数据字典
     * @param type 字典类型
     * @param values 字典值
     * @param joiner 值连接符
     * @return
     */
    public static Stream<DictItemVo> getDicts(String type, String values, String joiner) {
        return api.getDicts(type, values, joiner);
    }

    /**
     * 获取字典标签名
     * @param type 字典类型
     * @param values 字典值
     * @return
     */
    public static Stream<String> getLabels(String type, Collection<Integer> values) {
        return api.getLabels(type, values);
    }

    /**
     * 获取字典标签名
     * @param type 字典类型
     * @param values 字典值
     * @return
     */
    public static Stream<String> getLabels(String type, Integer...values) {
        return api.getLabels(type, values);
    }

    /**
     * 获取字典标签名
     * @param type 字典类型
     * @param values 字典值
     * @param joiner 值连接符
     * @return
     */
    public static Stream<String> getLabels(String type, String values, String joiner) {
       return api.getLabels(type, values, joiner);
    }

}
